#include <gtest/gtest.h>
#include <thread>
#include <chrono>
#include <pthread.h> // POSIX 线程接口，用于测试中主动取消线程

// 仅用于测试访问私有成员
#define private public
#define protected public
#include "ThreadPool.h"
#undef private
#undef protected

// 设置线程池模式
TEST(ThreadPoolTest, SetMode) {
  ThreadPool pool;
  pool.setMode(PoolMode::MODE_CACHED);

  EXPECT_EQ(pool.poolMode_, PoolMode::MODE_CACHED);
}

// 设置任务队列阈值
TEST(ThreadPoolTest, SetTaskQueueThreshold) {
  ThreadPool pool;
  pool.setTaskQueMaxThreshHold(256);

  EXPECT_EQ(pool.taskQueThreshHold_, 256);
}

// 验证 start() 创建并启动指定数量的线程。
// 注意：ThreadPool::threadFunc() 内部是死循环，测试中需使用 pthread_cancel 主动结束线程。
TEST(ThreadPoolTest, StartCreatesThreads) {
  ThreadPool pool;
  constexpr std::size_t kThreads = 2;

  pool.start(kThreads);

  ASSERT_EQ(pool.threads_.size(), kThreads);
  for (auto &thPtr : pool.threads_) {
    ASSERT_TRUE(thPtr);
  }

  // 略等片刻，确保线程执行至 threadFunc() 并进入等待队列的逻辑
  std::this_thread::sleep_for(std::chrono::milliseconds(20));

  // 线程函数无退出条件，这里使用 pthread_cancel 请求终止
  for (auto &thPtr : pool.threads_) {
    ASSERT_TRUE(thPtr);
    pthread_cancel(thPtr->worker_.native_handle());
  }

  // 取消后必须 join，确保线程资源被正确回收
  for (auto &thPtr : pool.threads_) {
    if (thPtr) {
      thPtr->join();
    }
  }
  pool.threads_.clear();
}